cmake_minimum_required(VERSION 3.10 FATAL_ERROR) ## 指定cmake版本

project(libx VERSION 0.1.0) ## 指定工程版本

set(CMAKE_CXX_STANDARD 17) ## 设置编译环境参数
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(THIRD ${PROJECT_SOURCE_DIR}/third)  ## 定义目标变量
set(HOME_DIR ${PROJECT_SOURCE_DIR}) ## 定义目标变量

set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/lib) ## 设置输出目录：静态库
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/lib) ## 设置输出目录：动态库
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/bin) ## 设置输出目录：可执行文件
set (LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/output) ## 设置输出目录：默认存放库文件的目录

add_subdirectory(basic/libbasic)  ## 添加一个子目录并构建该子目录
add_subdirectory(libbasic_gtest)  ## 添加一个子目录并构建该子目录
add_subdirectory(libbasic_mtest)  ## 添加一个子目录并构建该子目录

set(TARGET_NAME libx) ## 指定输出名称

add_definitions(-D_GTEST_) ## 添加预定义宏 _GTEST_

file(GLOB_RECURSE HAD_FILES inlcude/*.h) ## 指定头文件
file(GLOB_RECURSE SRC_FILES src/*.cpp) ## 指定源文件

file(GLOB_RECURSE REMOVE_SOURCE_FILES "example.cpp") ## 文件操作：递归遍历文件
list(REMOVE_ITEM SRC_FILES ${REMOVE_SOURCE_FILES}) ## 文件操作：删除文件

add_executable(${TARGET_NAME} ${SRC_FILES} main.cpp) ## 向指定的项目添加可执行文件的源文件

set_target_properties(${TARGET_NAME} PROPERTIES CXX_STANDARD 17) ## 设置目标属性

set(gtest_src ${HOME_DIR}/test/src) ## 定义变量

include_directories(${THIRD}/include) ## 向编译器添加头文件的搜索路径
link_directories(${THIRD}/lib) ## 向编译器添加额外的库搜索目录

## include_directories 与 target_include_directories 的区别
## include_directories会对当前CMakeLists.txt文件的目标文件生效，并会通过add_subdirectory调用传递到子目录
## target_include_directories则针对指定的目标文件生效

target_include_directories(${TARGET_NAME} PUBLIC ${HOME_DIR}/src) ## 指定目标头文件搜索目录，<target>必须用add_executable()或add_library()等命令先创建出来
target_link_libraries(${TARGET_NAME} code) ## 将指定的库连接到目标上
target_link_libraries(${TARGET_NAME} gtest)
target_link_libraries(${TARGET_NAME} gmock)

## 添加一条自定义构建规则，在目标构建前执行数据的复制指令
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${gtest_src}/data ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/data)


